home *** CD-ROM | disk | FTP | other *** search
- use POSIX;
-
- my $dialog = '/usr/bin/whiptail';
- $dialog = '/usr/bin/dialog' unless (-x $dialog);
-
- # code from dialog.pl(return_output)
- sub safe_redirect {
- pipe(PARENT_READER, CHILD_WRITER);
- my $pid = fork();
- if ($pid == 0) {
- close(PARENT_READER);
- dup2(fileno(CHILD_WRITER),3);
- open(STDOUT, ">&STDERR");
- exec(@_);
- die("exec failure: $_[0]");
- }
-
- my $ret = '';
- if ($pid > 0) {
- close(CHILD_WRITER);
- $ret .= <PARENT_READER>;
- close(PARENT_READER);
- waitpid($pid, 0);
- $result = $?; #GLOBAL Variable: result
- }
-
- return $ret;
- }
-
- sub linecount {
- my $text = shift;
- my $lines = 0;
- my $cnt = 0;
- my @words = split(/ /, $text);
- my($i, $len, $space);
-
- foreach $i (@words) {
- if ($i eq '\n') {
- $cnt = 0;
- next;
- }
-
- $len = length($i);
- while (1) {
- $lines++ if ($cnt == 0);
- $space = ($cnt > 0);
-
- if ($cnt + $space + $len > $DWIDTH) {
- if ($cnt == 0) {
- $len -= $DWIDTH;
- } else {
- $cnt = 0;
- }
- } else {
- $cnt += $len;
- last;
- }
- }
- }
-
- return $lines;
- }
-
- # code from pppconfig.
- #
- # Copyright (C) 1999 John G. Hasler (john@dhh.gt.org)
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
-
- sub dialogbox(@) {
- my $type=shift(@_);
- my $optionstr = (@_ > 0) ? shift(@_) : '';
- my @vars=@_;
- my $text=shift( @vars );
- my $height = shift( @vars );
- my $title = $DIALOGTITLE;
-
- my @options = split(' ', $optionstr) if ($optionstr ne '');
-
- # $result = callsystem_output('2>&1', '/usr/bin/dialog', '--clear', '--title',
- # $title, @options, $type, $text, $height, 80,
- # @vars);
- # my $item=$output;
- # chomp $item; # For gdialog, which returns strings with newlines.
-
- my $item = safe_redirect($dialog, '--output-fd', '3', '--clear', '--title',
- $title, @options, $type, $text, $height, 80, @vars);
-
- $result = ($result >> 8);
- exitfunc(255) if ($result == 255);
- exitfunc(255, "Internal error") unless($result == 0 || $result == 1);
- return $item;
- }
-
- sub msgbox(@) {
- my $text = shift;
- my $lines = linecount($text);
- $lines += 7;
-
- dialogbox("\-\-msgbox", '', $text, $lines);
-
- return $result;
- }
-
- sub infobox(@) {
- my $text = shift;
- my $lines = linecount($text);
- $lines += 7;
-
- dialogbox("\-\-infobox", '', $text, $lines);
-
- return $result;
- }
-
- sub yesnobox(@) {
- my $text = shift;
- my $lines = linecount($text);
- $lines += 7;
-
- dialogbox( "\-\-yesno", '', $text, $lines);
-
- return $result;
- }
-
- sub inputbox(@) {
- my $text = shift;
- my $default = shift;
- my $pattern = shift;
- my $allowempty = shift;
- my $lines = linecount($text);
- my @args;
- my $ret;
- $lines += 7;
-
- while(1) {
- @args = ();
- push(@args, $text);
- push(@args, $lines);
- push(@args, $default) if ($default ne '');
-
- $ret = dialogbox( "\-\-inputbox", '', @args);
-
- return '' if ($result != 0);
- return '' if ($ret eq '' && $allowempty != 0);
- return $ret if ($ret =~ /^$pattern+$/);
-
- if ($ret eq '') {
- $text = "Empty is not allowed.";
- } else {
- $default = $ret;
- $ret =~ s/$pattern//g;
- $default =~ s/[^$ret]/_/g;
- $text = "Illegal characters: \"$ret\".";
- if ($ret =~ / /) {
- $text .= "\n you can use underscore in place of space.";
- }
- }
- $lines = 8;
- }
- }
-
- sub menu(@) {
- my $text = shift( @_ );
- my $menu_height = shift( @_ );
- my $options = shift;
- my $lines = linecount($text);
- $lines += 6 + $menu_height;
-
- return dialogbox( '--menu', $options, $text, $lines, $menu_height, @_ );
- }
-
- sub menu_single(@) {
- my $text = shift;
- my $menu_height = shift;
- my $options = shift;
- my $lines = linecount($text);
- $lines += 6 + $menu_height;
-
- my @args = @_;
- my @pass = ();
- my $i;
-
- for ($i = 0; $i < @args; $i++) {
- if ($args[$i] ne '') {
- $pass[$i * 2] = $args[$i];
- $pass[$i * 2 + 1] = ' ';
- }
- }
-
- return dialogbox( '--menu', $options, $text, $lines, $menu_height,
- @pass );
- }
-
- sub checklist_single_onargs(@) {
- my $text = shift( @_ );
- my $menu_height = shift( @_ );
- my $onargs = shift;
- my $lines = linecount($text);
- $lines += 6 + $menu_height;
-
- my @args = @_;
- my @pass = ();
- my $i;
- my $j;
- my @ons = split(' ', $onargs);
-
- for ($i = $j = 0; $i < @args; $i++) {
- if ($args[$i] ne '') {
- $pass[$j++] = $args[$i];
- $pass[$j++] = ' ';
- $pass[$j++] = (grep($_ eq $args[$i], @ons)) ? 'on' : 'off';
- }
- }
-
- return dialogbox('--checklist', '--separate-output', $text, $lines,
- $menu_height, @pass );
- }
-
- $INPUTCOMMON_MENU = 1;
-
- sub input_menu {
- my $input_text = shift;
- my $default = shift;
- my $input_pattern = shift;
- my $input_allowempty = shift;
- my $input_menu_item = '';
- my $menu_text = '';
- my @menu_list = ();
- if (@_ >= 3) {
- $input_menu_item = shift;
- $menu_text = shift;
- @menu_list = @_;
- }
-
- while (1) {
- if (@menu_list > 0) {
- chomp($menu_text);
- my $lines = 1;
- while ($menu_text =~ /\n/m) {
- $menu_text =~ s/\n/\\n/m;
- $lines++;
- }
-
- my $menu_items = @menu_list;
- my $mlines = 15 - $lines;
- my $items = ($menu_items > $mlines) ? $mlines : $menu_items;
- my $default_item = '';
- $default_item = "--default-item $default" if ($default ne '' and $dialog =~ /(^|\/)dialog/);
- my $ret;
-
- if ($INPUTCOMMON_MENU == 1) {
- $ret = menu_single($menu_text, $items, $default_item,
- @menu_list);
- } else {
- $ret = menu($menu_text, $items, $default_item, @menu_list);
- }
-
- return '' if ($result != 0);
- return $ret if ($ret ne $input_menu_item);
- }
-
- chomp($input_text);
- $input_text =~ s/\n/\\n/gm;
-
- $ret = inputbox($input_text, $default, $input_pattern,
- $input_allowempty);
- return $ret if ($result == 0 || $menu_text eq '');
- }
- }
-
- sub input_checklist {
- my $input_text = shift;
- my $default = shift;
- my $input_pattern = shift;
- my $input_allowempty = shift;
- my $clist_text = '';
- my @clist_list = ();
- if (@_ > 0) {
- $clist_text = shift;
- @clist_list = @_;
- }
-
- while (1) {
- chomp($clist_text);
- my $lines = 1;
- while ($clist_text =~ /\n/m) {
- $clist_text =~ s/\n/\\n/m;
- $lines++;
- }
-
- my $clist_items = @clist_list;
- my $clines = 15 - $lines;
- my $items = ($clist_items > $clines) ? $clines : $clist_items;
- my $ret;
-
- $ret = checklist_single_onargs($clist_text, $items, $default,
- @clist_list);
- return '' if ($result != 0);
- chomp($ret);
- $ret =~ s/\n/ /g;
-
- $ret = inputbox($input_text, $ret, $input_pattern, $input_allowempty);
- return $ret if ($result == 0);
- }
- }
-
-
- sub input_menu2 {
- $INPUTCOMMON_MENU = 2;
- my $ret = input_menu(@_);
- $INPUTCOMMON_MENU = 1;
- return $ret;
- }
-
-
-
- 1;
-
-